package br.usp.ime.protoc.genotipagem;

import java.util.HashSet;
import java.util.Iterator;

import com.google.gwt.user.client.rpc.IsSerializable;

import br.usp.ime.protoc.fujaba.FEmptyIterator;
import br.usp.ime.protoc.pessoa.Pessoa;

public class Genotipagem implements IsSerializable
{
   /**
    * <pre>
    *              1        has        1..* 
    * Genotipagem -------------------------- Amostra
    *              genotipagem      amostra 
    * </pre>
    */
   private HashSet amostra;

   public boolean addToAmostra(Amostra value)
   {
      boolean changed = false;
      if (value != null)
      {
         if (this.amostra == null)
         {
            this.amostra = new HashSet (); // or FTreeSet () or FLinkedList ()
         }
         
         changed = this.amostra.add (value);
         if (changed)
         {
            value.setGenotipagem (this);
         }
         
      }
      return changed;
   }

   public boolean hasInAmostra(Amostra value)
   {
      return ((this.amostra != null) &&
              (value != null) &&
              this.amostra.contains (value));
   }

   public Iterator iteratorOfAmostra()
   {
      return ((this.amostra == null)
              ? FEmptyIterator.get ()
              : this.amostra.iterator ());
   }

   public void removeAllFromAmostra()
   {
      Amostra tmpValue;
      Iterator iter = this.iteratorOfAmostra ();
      while (iter.hasNext ())
      {
         tmpValue = (Amostra) iter.next ();
         this.removeFromAmostra (tmpValue);
      }
   }

   public boolean removeFromAmostra(Amostra value)
   {
      boolean changed = false;
      if ((this.amostra != null) && (value != null))
      {
         
         changed = this.amostra.remove (value);
         if (changed)
         {
            value.setGenotipagem (null);
         }
         
      }
      return changed;
   }

   public int sizeOfAmostra()
   {
      return ((this.amostra == null)
              ? 0
              : this.amostra.size ());
   }

   /**
    * <pre>
    *              1..*       has       1..* 
    * Genotipagem --------------------------- Genotipo
    *              genotipagem      genotipo 
    * </pre>
    */
   private HashSet genotipo;

   public boolean addToGenotipo(Genotipo value)
   {
      boolean changed = false;
      if (value != null)
      {
         if (this.genotipo == null)
         {
            this.genotipo = new HashSet (); // or FTreeSet () or FLinkedList ()
         }
         
         changed = this.genotipo.add (value);
         if (changed)
         {
            value.addToGenotipagem (this);
         }
         
      }
      return changed;
   }

   public boolean hasInGenotipo(Genotipo value)
   {
      return ((this.genotipo != null) &&
              (value != null) &&
              this.genotipo.contains (value));
   }

   public Iterator iteratorOfGenotipo()
   {
      return ((this.genotipo == null)
              ? FEmptyIterator.get ()
              : this.genotipo.iterator ());
   }

   public void removeAllFromGenotipo()
   {
      Genotipo tmpValue;
      Iterator iter = this.iteratorOfGenotipo ();
      while (iter.hasNext ())
      {
         tmpValue = (Genotipo) iter.next ();
         this.removeFromGenotipo (tmpValue);
      }
   }

   public boolean removeFromGenotipo(Genotipo value)
   {
      boolean changed = false;
      if ((this.genotipo != null) && (value != null))
      {
         
         changed = this.genotipo.remove (value);
         if (changed)
         {
            value.removeFromGenotipagem (this);
         }
         
      }
      return changed;
   }

   public int sizeOfGenotipo()
   {
      return ((this.genotipo == null)
              ? 0
              : this.genotipo.size ());
   }

   /**
    * <pre>
    *              1         has         1 
    * Genotipagem ------------------------- Pessoa
    *              genotipagem      pessoa 
    * </pre>
    */
   private Pessoa pessoa;

   public Pessoa getPessoa()
   {
      return this.pessoa;
   }

   public boolean setPessoa(Pessoa value)
   {
      boolean changed = false;
      if (this.pessoa != value)
      {
         Pessoa oldValue = this.pessoa;
         
         if (this.pessoa != null)
         {
            this.pessoa = null;
            oldValue.setGenotipagem (null);
         }
         this.pessoa = value;
         if (value != null)
         {
            value.setGenotipagem (this);
         }
         changed = true;
         
      }
      return changed;
   }

   public void removeYou()
   {
      removeAllFromGenotipo ();
      removeAllFromAmostra ();
      Pessoa tmpPessoa = getPessoa ();
      if (tmpPessoa != null)
      {
         setPessoa (null);
      }
   }

}
